<?php

namespace app\libs\traits;

/**
 *  统一 Api Response 响应处理
 */
trait ApiResponse
{

    /*
    格式固定
    {
        "status": "success", // 描述 HTTP 响应结果：HTTP 状态响应码在 500-599 之间为”fail”，在 400-499 之间为”error”，其它均为”success”
        "code": 200, // 包含一个整数类型的 HTTP 响应状态码，也可以是业务描述操作码，比如 200001 表示注册成功
        "message": "操作成功", // 多语言的响应描述
        "data": {}, // 实际的响应数据
        "error": {} // 异常时的调试信息
    }
    */

    /**
     * @var int
     */
    protected $httpCode = 200;

    /**
     * @return mixed
     */
    public function getHttpCode()
    {
        return $this->httpCode;
    }

    /**
     * @param $httpCode
     * @return $this
     */
    public function setHttpCode($httpCode)
    {
        $this->httpCode = $httpCode;

        return $this;
    }

    /**
     * @param $data
     * @param array $header
     * @return mixed
     */
    public function respond($data, $header = [])
    {
        return json($data, $this->getHttpCode(), $header);
    }

    /**
     * @param $status
     * @param $code
     * @param string $message
     * @param mixed $data
     * @param null $error
     * @return mixed
     */
    public function status($status, $code, $message, $data = null, $error = null)
    {
        if ($code) {
            $this->setHttpCode($code);
        }
        $status = [
            // 描述 HTTP 响应结果：HTTP 状态响应码在 500-599 之间为”fail”，在 400-499 之间为”error”，其它均为”success”
            'status' => $status,
            // 包含一个整数类型的 HTTP 响应状态码，也可以是业务描述操作码，比如 200001 表示注册成功
            'code' => $this->httpCode,
            // 响应描述
            'message' => $message,
            // 实际的响应数据
            'data' => $data,
            // 异常时的调试信息
            'error' => $error
        ];

        return $this->respond($status);
    }

    /**
     * @param $message
     * @param string $status
     * @param null $error
     * @return mixed
     */
    public function message($message, $status = 'success', $error = null)
    {
        $code = $this->httpCode;
        return $this->status($status, $code, $message, null, $error);
    }

    /**
     * @param $message
     * @param int $code
     * @param string $status
     * @return mixed
     */
    public function failed($message, $code = 500, $status = 'fail')
    {
        return $this->setHttpCode($code)->message($message, $status);
    }

    /**
     * @param $data
     * @param $code
     * @param $message
     * @param string $status
     * @return mixed
     */
    public function success($data, $code = 200, $message = 'successful', $status = 'success')
    {
        //return $this->status($status, $code, $message, compact('data'));
        return $this->status($status, $code, $message, $data);
    }

    /**
     * @param $message
     * @param int $code
     * @param string $status
     * @param null $error
     * @return mixed
     */
    public function error($message, $code = 400, $status = 'error', $error = null)
    {
        return $this->setHttpCode($code)->message($message, $status, $error);
    }

    /**
     * @param string $message
     * @return mixed
     */
    public function notFond($message = 'Not Fond!')
    {
        return $this->failed($message, 404);
    }
}
